/*! \file InLogNeg.h
    \brief Interface do Modulo Vetor de Bits.

   //fazer um conmetario
 */

#ifndef LogNeg
#define LogNeg

#ifdef LogNeg_Serv
#define ExtLN
#else
#define ExtLN extern
#endif

#define USUARIOMESTRE "admin"
#define SENHAMESTRE "admin"
#define NUMEROALBUMSPORUSER 5
#define NUMEROFOTOSPORALBUM 10
#define NUMEROMAXTENTATIVAS 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "InPerAlb.h"
#include "InPerFot.h"
#include "InPerUsr.h"

/*!	\struct FotoUsr
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct FotoUsr {
    char Cpf[12];
    char CodigAlbum[11];
    char CodigFoto[11]; /**< Um vetor de caracteres com 11 posicoes que Armazena o codigo da foto */
    char Nome[16]; /**< Um vetor de caracteres com 15 posicoes que Armazena o nome da foto*/
    char Data[11]; /**< Um vetor de caracteres com 11 posicoes que Armazena a data da foto*/
    char Veloc[4]; /**< Um vetor de caracteres com 4 posicoes que Armazena o coeficiente da velocidade da foto \n ex.: para 1/2 Armazanamos 2*/
    char Abert[4]; /**< Um vetor de caracteres com 4 posicoes que Armazena a Abertura com que a foto foi tirada*/
    char Iso[4]; /**< Um vetor de caracteres com 4 posicoes que Armazena o iso da foto*/
    float Media; /**< um float que Armazena a media da foto**/
    int NumerVotos;

    struct FotoUsr *Prox;
};

/*! \var typedef struct usuario_M User
    \brief Representacao do usuario
 */

typedef struct FotoUsr Foto_LN;

/**
   \struct AlbumStr
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct AlbumStr {
    char Cpf[12]; /**< Um vetor de caracteres com 11 posicoes que quarda o cpf do usuario */
    char Codig[11]; /**< Um vetor de caracteres com 10 posicoes que quarda o codigo do album do usuario*/
    char Nome[16]; /**< Um vetor de caracteres com 16 posicoes que quarda o nome do usuario*/
    char Descr[31]; /**< Um vetor de caracteres com 31 posicoes que quarda a descricao do album do usuario*/
    int NumerFotos; /**< um inteiro que quarda o numero de fotos de um determinado usuario*/
    int Priva; /**<um inteiro que guarda o nivel de acesso do album:\n	1 = Privado\n	2 = Publico*/

    Foto_LN *ListaFotos;
    struct AlbumStr *Prox;
};

/*! \var typedef struct AlbumStr Album
    \brief Representacao do usuario
 */
typedef struct AlbumStr Album_LN;

/**
   \struct Usuario
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct Usuario {
    char Cpf[12]; /**< Um vetor de caracteres com 12 posicoes que quarda o cpf do usuario */
    char Nome[16]; /**< Um vetor de caracteres com 15 posicoes que quarda o nome do usuario*/
    char Senha[5]; /**< Um vetor de caracteres com 4 posicoes que quarda a senha do usuario*/
    int NumerAlbum; /**< um inteiro que quarda o numero de albuns que um usuario tem*/

    Album_LN *ListaAlbum;
};

/*! \var typedef struct usuario_M User
    \brief Representacao do usuario
 */
typedef struct Usuario User_LN;

struct ListaUsuario_LN {
    char Cpf[12]; /**< Um vetor de caracteres com 12 posicoes que quarda o cpf do usuario */
    char Nome[16]; /**< Um vetor de caracteres com 15 posicoes que quarda o nome do usuario*/
    struct ListaUsuario_LN *Prox; /**< Um ponteiro pro proximo elemento da lista de usuarios*/
};
/*! \var typedef struct usuario_M User
    \brief Representacao do usuario
 */

typedef struct ListaUsuario_LN ListaUsers_LN;

/*! \file ModLogNeg.c
    \brief Modulo Vetor de Bits.

    As Responsabilidades do vetor de Bits consistem em
    Gericiar os espacos livros de um certo arquivo de registros atraves de
    um arquivo binario.
 */

int TransformaAlbum_LN(Album_LN *AlbumPass, Album_PA *NovoAlbum);

int TransformaFoto_LN(Foto_LN *FotoPass, Foto_PF *NovaFoto);

int RetransformaAlbum_LN(Album_LN *AlbumPass, Album_PA *NovoAlbum);

int RetransformaFoto_LN(Foto_LN *FotoPass, Foto_PF *NovaFoto);

int AddConta_LN(const char* CpfPass, const char* NomePass, const char* SenhaPass); //terminar, 3 nomes,

int AddAlbum_LN(const char* CpfPass, Album_LN *AlbumPass);

int AddFoto_LN(const char* CpfPass, const char* CodigAlbumPass, Foto_LN *FotoPass);

int EditaConta_LN(const char* CpfPass, const char* NomePass, const char* SenhaPass);

int EditaAlbum_LN(Album_LN *AlbumPass);

int EditaFoto_LN(Foto_LN *FotoPass);

int DeletaConta_LN(const char *CpfPass, User_LN *UserPass);

int DeletaAlbum_LN(const char *CpfPass, const char *CodigAlbum, Album_LN *AlbumPass);

int DeletaFoto_LN(const char *CpfPass, const char *CodigAlbum, const char *CodigFoto);

int FazLogin_LN(User_LN *UserPass);

int ListaAlbunsUsuario_LN(Album_LN **Publi, const char* CpfPass);

int ListaFotosAlbum_LN(Foto_LN **Fotos, const char *CpfPass, const char *CodigPass);

int ListaAlbunsPublicos_LN(Album_LN **Publi);

int PegaUsuario_LN(User_LN *UserPass);

int PegaFoto_LN(Foto_LN *);

int PegaAlbum(Album_LN *AlbumPass);

int VotaEmFoto_LN(Foto_LN* FotoPass, int ValorVoto);

int MudaFotoAlbum_LN(Foto_LN* FotoPass, const char* CodigAlbum);

int ListaUsuariosBloqueados_LN(ListaUsers_LN **Bloqu);

int DesbloqueiaUsuario_LN(const char* CpfPass);

int VerificaAdmin(const char* NomePass, const char* SenhaPass);

#endif
